package cn.dglydrpy.study.webserver.servlet;

import java.io.RandomAccessFile;
import java.util.Arrays;

import cn.dglydrpy.study.webserver.core.Constant;
import cn.dglydrpy.study.webserver.http.HttpRequest;
import cn.dglydrpy.study.webserver.http.HttpResponse;

/**
 * 处理注册业务
 */
public class RegServlet extends HttpServlet {
	
	public void service(HttpRequest request, HttpResponse response) {
		System.out.println("RegServlet:开始处理注册...");
		/*
		 * 注册业务的流程   
		 */
		// 1:通过request获取用户注册信息
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String nickname = request.getParameter("nickname");
		int age = Integer.parseInt(request.getParameter("age"));

		// 2:将信息写入文件user.dat中
		try (RandomAccessFile raf = new RandomAccessFile(Constant.RESOURCES_DIR+"user.dat", "rw");) {
			/*
			 * 首先判断user.dat文件中是否已经存在该用户，
			 * 若存在则响应用户注册提示页面,提示该用户已存在，
			 * 否则才将该用户信息写入user.dat文件
			 * 
			 * 注册提示页面:reg_have_user.html
			 * 提示也中显示一行字，内容为:该用户已存在，请重写注册信息!
			 */
			for(int i=0;i<raf.length()/100;i++) {
				raf.seek(i*100);
				byte[] data = new byte[32];
				raf.read(data);
				String name = new String(data,"UTF-8").trim();
				if(name.equals(username)) {
					//该用户已存在
					forward("/myweb/reg_have_user.html", request, response);
					return;
				}
			}
			
			
			// 先将指针移动到文件末尾,以便追加新记录
			raf.seek(raf.length());
			/*
			 * 每条记录占用100字节,其中用户名,密码, 昵称各占32字节,int型的age占4字节. 数据"留白"的目的是便于后期修改信息.
			 */
			// 写用户名
			byte[] data = username.getBytes("UTF-8");
			data = Arrays.copyOf(data, 32);
			raf.write(data);// 一次写了32字节

			data = password.getBytes("UTF-8");
			data = Arrays.copyOf(data, 32);
			raf.write(data);

			data = nickname.getBytes("UTF-8");
			data = Arrays.copyOf(data, 32);
			raf.write(data);

			raf.writeInt(age);

			//3.注册完毕,响应注册成功页面给客户端
			forward("/myweb/reg_success.html", request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("RegServlet:处理注册完毕!");
	}
}
